/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.seguridad.controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.seguridad.bean.Formulario;
import sv.com.intesal.seguridad.bean.Modulo;
import sv.com.intesal.seguridad.bean.Roles;
import sv.com.intesal.seguridad.bean.Usuario;
import sv.com.intesal.seguridad.sql.SQLRoles;

/**
 *
 * @author JM
 */
public class RolesControlador {

    public void insertRoles_Formularios() throws Exception {
        /*CUANDO INGRESAN UN FORMULARIO NUEVO. TODOS LOS USUARIOS TENDRAN EL FORMULARIO SIN PRIVILEGIOS*/

        ResultSet rs = null;
        Connection cnn = null;
        try {
            cnn = cConexion.conectar();

            FormularioControlador fc = new FormularioControlador();
            Integer getMax = fc.getMax();

            UsuarioControlador uc = new UsuarioControlador();
            rs = uc.getUsuarios();

            while (rs.next()) {
                PreparedStatement ps = null;
                ps = cnn.prepareStatement(SQLRoles.insertRol);
                ps.setInt(1, getMax);
                ps.setInt(2, rs.getInt("id_u"));
                ps.setString(3, "NO");
                ps.setString(4, "NO");
                ps.setString(5, "NO");
                ps.setString(6, "NO");
                ps.setString(7, "NO");
                ps.setString(8, "NO");
                ps.executeUpdate();
                ps.close();
            }
        } catch (Exception ex) {
            throw new Exception(ex);
        }
    }

    public void insertRoles_Usuarios() throws Exception {
        /*CUANDO INGRESAN UN USUARIO NUEVO. EL USUARIO TENDRAN LOS FORMULARIO SIN PRIVILEGIOS*/

        ResultSet rs = null;
        Connection cnn = null;
        try {
            cnn = cConexion.conectar();

            UsuarioControlador uc = new UsuarioControlador();
            Integer getMax = uc.getMax();

            FormularioControlador fc = new FormularioControlador();
            rs = fc.getFormularios();
            while (rs.next()) {
                PreparedStatement ps = null;
                ps = cnn.prepareStatement(SQLRoles.insertRol);
                ps.setInt(1, rs.getInt("codigo_f"));
                ps.setInt(2, getMax);
                ps.setString(3, "NO");
                ps.setString(4, "NO");
                ps.setString(5, "NO");
                ps.setString(6, "NO");
                ps.setString(7, "NO");
                ps.setString(8, "NO");
                ps.executeUpdate();
                ps.close();
            }

        } catch (Exception ex) {
            throw new Exception(ex);
        }
    }

    public ResultSet getRoles_Usuario(int codigo_u) throws Exception {
        try {
            Connection cnn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;

            cnn = cConexion.conectar();

            ps = cnn.prepareStatement(SQLRoles.getRoles_Usuario);
            //ps.setInt(1, Variables_Globales.var_codigo_u);
            ps.setInt(1, codigo_u);
            rs = ps.executeQuery();

            return rs;
        } catch (Exception ex) {
            throw new Exception(ex);
        }
    }

    public Boolean validarRoles_Accion(String webForm, String accion, Integer codigo_u) throws Exception {
        try {
            String sql = "select count(*) as contar from roles as r,formulario as f where f.codigo_f=r.codigo_f and f.nombre_form_f=? and r.id_u=? ";
            if (accion.equals("ANULAR")) {
                sql = sql + " and eliminar_r='SI'";
            } else {
                sql = sql + " and " + accion.toLowerCase() + "_r='SI'";
            }

            PreparedStatement ps = cConexion.conectar().prepareStatement(sql);
            ps.setString(1, webForm);
            ps.setInt(2, codigo_u);

            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                if (rs.getInt("contar") >= 1) {
                    return true;
                }
            }
            return false;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void actualizarRoles(List<Roles> lRoles) throws Exception {

        try {
            PreparedStatement ps = null;
            Connection cnn = null;
            cnn = cConexion.conectar();

            ps = cnn.prepareStatement(SQLRoles.updateRol);
            String yes = "SI";
            String no = "NO";
            for (int i = 0; i < lRoles.size(); i++) {

                if (lRoles.get(i).getAgregar_r() == true) {
                    ps.setString(1, yes);
                } else {
                    ps.setString(1, no);
                }

                if (lRoles.get(i).getModificar_r() == true) {
                    ps.setString(2, yes);
                } else {
                    ps.setString(2, no);
                }

                if (lRoles.get(i).getBuscar_r() == true) {
                    ps.setString(3, yes);
                } else {
                    ps.setString(3, no);
                }

                if (lRoles.get(i).getEliminar_r() == true) {
                    ps.setString(4, yes);
                } else {
                    ps.setString(4, no);
                }

                if (lRoles.get(i).getVisible_r() == true) {
                    ps.setString(5, yes);
                } else {
                    ps.setString(5, no);
                }
                if (lRoles.get(i).getReporte_r() == true) {
                    ps.setString(6, yes);
                } else {
                    ps.setString(6, no);
                }
                ps.setInt(7, lRoles.get(i).getCodigo_r());
                ps.executeUpdate();
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Roles> getRoles(Integer codigo_u) throws Exception {

        List<Roles> lRol = new ArrayList<Roles>();

        try {
            Connection cnn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;

            cnn = cConexion.conectar();

            ps = cnn.prepareStatement(SQLRoles.getRoles_Usuario);
            //ps.setInt(1, Variables_Globales.var_codigo_u);
            ps.setInt(1, codigo_u);
            rs = ps.executeQuery();

            while (rs.next()) {

                Roles ro = new Roles();
                ro.setCodigo_r(rs.getInt("codigo_r"));

                Modulo mo = new Modulo();
                mo.setCodigo_m(rs.getInt("codigo_m"));
                mo.setNombre_m(rs.getString("nombre_m"));

                Formulario f = new Formulario();
                f.setCodigo_f(rs.getInt("codigo_f"));
                f.setNombre_f(rs.getString("nombre_f"));
                f.setNombre_form_f(rs.getString("nombre_form_f"));

                Usuario u = new Usuario();
                u.setCodigo_u(rs.getInt("id_u"));
                u.setUsername(rs.getString("usuario_u"));

                ro.setModulo(mo);
                ro.setFormulario(f);
                ro.setUsuario(u);

                if (rs.getString("agregar_r").equals("SI")) {
                    ro.setAgregar_r(Boolean.TRUE);
                } else {
                    ro.setAgregar_r(Boolean.FALSE);
                }

                if (rs.getString("modificar_r").equals("SI")) {
                    ro.setModificar_r(Boolean.TRUE);
                } else {
                    ro.setModificar_r(Boolean.FALSE);
                }

                if (rs.getString("eliminar_r").equals("SI")) {
                    ro.setEliminar_r(Boolean.TRUE);
                } else {
                    ro.setEliminar_r(Boolean.FALSE);
                }

                if (rs.getString("buscar_r").equals("SI")) {
                    ro.setBuscar_r(Boolean.TRUE);
                } else {
                    ro.setBuscar_r(Boolean.FALSE);
                }

                if (rs.getString("visible_r").equals("SI")) {
                    ro.setVisible_r(Boolean.TRUE);
                } else {
                    ro.setVisible_r(Boolean.FALSE);
                }
                if (rs.getString("reporte_r").equals("SI")) {
                    ro.setReporte_r(Boolean.TRUE);
                } else {
                    ro.setReporte_r(Boolean.FALSE);
                }
                lRol.add(ro);
            }
            rs.close();
            ps.close();
            cnn.close();
            return lRol;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void updateRol(Roles r) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLRoles.updateRol);
            String yes = "SI";
            String no = "NO";

            if (r.getAgregar_r() == false) {
                ps.setString(1, no);
            } else {
                ps.setString(1, yes);
            }

            if (r.getModificar_r() == false) {
                ps.setString(2, no);
            } else {
                ps.setString(2, yes);
            }

            if (r.getBuscar_r() == false) {
                ps.setString(3, no);
            } else {
                ps.setString(3, yes);
            }

            if (r.getEliminar_r() == false) {
                ps.setString(4, no);
            } else {
                ps.setString(4, yes);
            }

            if (r.getVisible_r() == false) {
                ps.setString(5, no);
            } else {
                ps.setString(5, yes);
            }

            if (r.getReporte_r() == false) {
                ps.setString(6, no);
            } else {
                ps.setString(6, yes);
            }

//            if (rs.getString("agregar_r").equals("NO") || r.getAgregar_r() == false) {
            ps.setInt(7, r.getCodigo_r());
            ps.executeUpdate();

            cnn.close();
            ps.close();

            Mensaje m = new Mensaje();
            m.messageInfo(m.getImodificada());

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void updateRoles_Especiales(Roles r) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;

        try {
            cnn = cConexion.conectar();

            if (r.getAll_modulos() == true) {
                ps = cnn.prepareStatement(SQLRoles.updateRoles_Modulo_All);
            } else {
                ps = cnn.prepareStatement(SQLRoles.updateRoles_Modulo);
                ps.setInt(8, r.getCodigo_m());
            }

            String yes = "SI";
            String no = "NO";

            if (r.getAgregar_all_r() == false) {
                ps.setString(1, no);
            } else {
                ps.setString(1, yes);
            }

            if (r.getModificar_all_r() == false) {
                ps.setString(2, no);
            } else {
                ps.setString(2, yes);
            }

            if (r.getBuscar_all_r() == false) {
                ps.setString(3, no);
            } else {
                ps.setString(3, yes);
            }

            if (r.getEliminar_all_r() == false) {
                ps.setString(4, no);
            } else {
                ps.setString(4, yes);
            }

            if (r.getVisible_all_r() == false) {
                ps.setString(5, no);
            } else {
                ps.setString(5, yes);
            }

            if (r.getReporte_all_r() == false) {
                ps.setString(6, no);
            } else {
                ps.setString(6, yes);
            }

            ps.setInt(7, r.getId_u());
            ps.executeUpdate();

            Mensaje m = new Mensaje();
            m.messageInfo(m.getImodificada());

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void setRoles_x_Formularios_y_Usuarios() throws Exception {
        try {

            ResultSet rs_usuario = null;
            ResultSet rs_formulario = null;

            FormularioControlador fc = new FormularioControlador();
            UsuarioControlador uc = new UsuarioControlador();
            rs_usuario = uc.getUsuarios();


            while (rs_usuario.next()) {
                /*MANADAR A TRAER TODOS LOS FORMULARIOS Y USUARIOS y ASIGNAR ROLES NULOS*/
                rs_formulario = fc.getFormularios();
                while (rs_formulario.next()) {

                    /*SI YA TIENE REGISTRO NOS DEVUELVE FALSO*/
                    if (this.validarUsuario_x_Formluario(rs_usuario.getInt("id_u"), rs_formulario.getInt("codigo_f")) == true) {

                        PreparedStatement ps = null;
                        Connection cnn = null;
                        cnn = cConexion.conectar();

                        ps = cnn.prepareStatement(SQLRoles.insertRol);
                        ps.setInt(1, rs_formulario.getInt("codigo_f"));
                        ps.setInt(2, rs_usuario.getInt("id_u"));
                        ps.setString(3, "NO");
                        ps.setString(4, "NO");
                        ps.setString(5, "NO");
                        ps.setString(6, "NO");
                        ps.setString(7, "NO");
                        ps.setString(8, "NO");
                        ps.executeUpdate();
                        ps.close();
                    }
                }
            }

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIinformation());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private Boolean validarUsuario_x_Formluario(Integer codigo_u, Integer codigo_f) throws Exception {

        /*VALIDAR SI EL USUARIO TIENE YA ASIGNADO EL FORMULARIO. ENTONCES NO TIENE UN REGISTRO EN ROLES SERA TRUE*/
        PreparedStatement ps = null;
        Connection cnn = null;
        ResultSet rs = null;
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLRoles.getCountUsuario_x_Formulario);
            ps.setInt(1, codigo_u);
            ps.setInt(2, codigo_f);
            rs = ps.executeQuery();
            rs.next();

            if (rs.getInt("count") == 0) {
                return true; // ingresar registro en roles
            }
            return false; // no ingresar ningun registro en roles
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void insert_Formulario_Usuario_Roles() throws Exception {
        try {
            PreparedStatement ps = cConexion.conectar().prepareStatement(SQLRoles.insert_Formulario_Usuario_Roles);
            ps.executeUpdate();
            ps.close();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
    /**
     * UPDATE ROLES A PARTIR DE UN PERFIL QUE ESTA EN LA TABLA ROL_USUARIO
     */
//    public void updateRoles_x_PerfilUsuario(List<RolUsuario> r)throws Exception{
//
//        try {
//
//        } catch (Exception e) {
//            throw new Exception(e);
//        }
//    }
    /*
    update roles as ro set  agregar_r= ( select r.agregar_ru FROM ROL as rol,ROL_USUARIO as r where rol.codigo_rol=r.codigo_rol
    and rol.codigo_rol=4 and r.codigo_f=ro.codigo_f),

    modificar_r= ( select r.modificar_ru FROM ROL as rol,ROL_USUARIO as r where rol.codigo_rol=r.codigo_rol
    and rol.codigo_rol=4 and r.codigo_f=ro.codigo_f),

    buscar_r= ( select r.buscar_ru FROM ROL as rol,ROL_USUARIO as r where rol.codigo_rol=r.codigo_rol
    and rol.codigo_rol=4 and r.codigo_f=ro.codigo_f),

    visible_r= ( select r.visible_ru FROM ROL as rol,ROL_USUARIO as r where rol.codigo_rol=r.codigo_rol
    and rol.codigo_rol=4 and r.codigo_f=ro.codigo_f),

    eliminar_r= ( select r.eliminar_ru FROM ROL as rol,ROL_USUARIO as r where rol.codigo_rol=r.codigo_rol
    and rol.codigo_rol=4 and r.codigo_f=ro.codigo_f)
    where ro.id_u=1*/
}